package com.bjpowernode.javase.exception;
/*
    用异常来改进这道题

 */
public class MyStack {  //栈类
    //提供一个数组来存储栈中的元素
    Object[] elements;                //Object什么都可以存

    //栈帧（永远指向栈顶部的元素）
    //每加一个元素，栈帧+1
    //每减一个元素，栈帧-1
    int index;

    //构造方法
    //给一维数组一个初始化容量
    public MyStack() {
    }
    public MyStack(Object[] elements , int index) {
        this.elements = elements;
        this.index = index;
    }

    //push方法，压栈，表示栈中多一个元素，如果已满则压栈失败
    public void push(Object obj) throws MyException {
        if (index < elements.length - 1){
            //index += 1 ;
            elements[index += 1] = obj;
            System.out.println("压栈成功，内容是：" + obj + "，此时栈帧为：" + index);
        }else if(index == elements.length - 1){
            MyException e = new MyException("栈已满，压栈失败");
            throw e;  //手动抛出异常，谁调用可能得到这个异常提示
            //System.out.println("栈已满，压栈失败");   //改进
        }else System.out.println("压栈失败");
    }
    //pop方法，弹栈，表示栈中少一个元素，如果栈已空，弹栈失败
    public void pop() throws MyException {
        if (-1 < index && index < elements.length){
            index -= 1 ;
            System.out.println("弹栈成功，内容是：" + elements[index + 1] + "此时栈帧为：" + index);
        }else if(index == -1){
            MyException e = new MyException("栈已空，弹栈失败");
            throw e;
            //System.out.println("栈已空，弹栈失败");  //改进
        }else System.out.println("弹栈失败");
    }
}
class Test{
    public static void main(String[] args) {
        MyStack myStack = new MyStack(new Object[10] , -1);   //index = -1表示此时栈帧指向顶部元素
        try {
            myStack.push("文梦甜");
            myStack.push("文梦甜甜");
            myStack.push("文梦甜甜甜");
            myStack.push("文梦甜甜甜甜");
            myStack.push("文梦甜甜甜甜甜");
            myStack.push("文梦甜甜甜甜甜甜");
            myStack.push("文梦甜甜甜甜甜甜甜");
            myStack.push("文梦甜甜甜甜甜甜甜甜");
            myStack.push("文梦甜甜甜甜甜甜甜甜甜");
            myStack.push("文梦甜甜甜甜甜甜甜甜甜甜");
            myStack.push("文梦甜甜甜甜甜甜甜甜甜甜甜"); //失败
        } catch (MyException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }

        try {
            myStack.pop();
            myStack.pop();
            myStack.pop();
            myStack.pop();
            myStack.pop();
            myStack.pop();
            myStack.pop();
            myStack.pop();
            myStack.pop();
            myStack.pop();
            myStack.pop();

        } catch (MyException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }

    }
}